import { getSetting, chooseAddress, openSetting, showModal, showToast } from "../../utils/asyncWx.js"
// pages/cart/cart.js
Page({
    /* 
      1 获取收货地址
        绑定点击事件
        调用小程序内置 api 获取用户的收货地址
      2 获取用户对小程序授予获取地址的权限状态 scope authSetting
        1 当获取用户地址提示框 确定 scope.address:true 直接调用收货地址
        2 当获取用户地址提示框 取消 scope.address:false
            1 诱导用户给予授权设置页面，给与权限后从新获取地址
            2 获取收货地址
        3 用户从来没有调用过收货地址的api 
            scope为 undefinde 直接调用收货地址
        4 将数据添加到缓存中
    3 页面加载完毕
        0 onLoad onShow
        1 获取存储中的地址数据
        2 把数据设置给data中的一个变量
    4 onshow 
        获取缓存中的购物车数组
        把购物车数据填充到data中
    5 全选实现数据展示
        1 onShow 获取缓存中的购物车数组
        2 根据购物车中的商品数据计算
    6 商品选中
        1 绑定 change事件
        2 获取到被修改的商品对象
        3 商品对象的选中状态 取反
        4 重新填充会data中和缓存中
        5 重新计算全选和总价 总数量
    7 全选和反选
        1 全选复选框绑定事件 change
        2 获取data种的全选变量 allChecked
        3 直接取反 allChecked=！allChecked
        4 遍历购物车数组，让里面商品选中状态跟随 allChecked
        5 重新设置data数据和缓存数据
    8 商品数量的编辑功能
        1 "+","-" 按钮绑定同一个点击事件区分的关键 自定义属性
        2 "+" +1 "-" -1
        3 传递点击的商品id goods_id
        4 获取购物车数据，修改上屏对象
        5 直接修改属性，重新设置回缓存和data中 this.setCart
    9 删除购物车数量 当购物车数量为 1 时，再次点击就弹窗提示是否删除
     （showModal）弹窗
        1 确定
        2 取消
    10 结算
        1 收货地址
        2 有没有选购商品
        3 跳转支付页面

    */
    /**
     * 页面的初始数据
     */
    data: {
        // 用户地址
        address: {},
        // 购物车数据
        cart: [],
        // 全选
        allChecked: false,
        // 总价格
        totalPrice: 0,
        // 总数量
        totalNum: 0
    },
    onShow() {
        //1 获取缓存中的收货地址信息
        const address = wx.getStorageSync('address');
        // 获取缓存中的购物车数据
        const cart = wx.getStorageSync("cart") || [];
        // 1 计算全选
        //  every 数组方法 会遍历 接收一个回调函数 每一个回调函数都返回true 那么every方法的返回值为true
        // 空数组调用every返回值为true
        // cart.length ? cart.every(v => v.checked) : false;
        this.setData({ address });
        this.setCart(cart)
    },
    /**
     * 生命周期函数--监听页面加载
     */
    onLoad: function(options) {

    },
    // 点击收货地址
    async handleChooseAddress() {
        // wx.chooseAddress({
        //     success: (result) => {
        //         console.log(result);
        //     }
        // });
        // wx.getSetting({
        //     success: (result) => {
        //         // 当属性名怪异时，都要用[]来获取属性代替 .
        //         const scopeAddress = result.authSetting["scope.address"];
        //         if (scopeAddress === true || scopeAddress === undefined) {
        //             wx.chooseAddress({
        //                 success: (result1) => {
        //                     console.log(result1);
        //                 }
        //             });

        //         } else {
        //             // 用户以前拒绝过授权,打开授权页面
        //             wx.openSetting({
        //                 success: (result2) => {
        //                     // 4 可以调用收货地址代码
        //                     wx.chooseAddress({
        //                         success: (result3) => {
        //                             console.log(result3);
        //                         }
        //                     });
        //                 }

        //             });

        //         }

        //     },
        //     fail: () => {},
        //     complete: () => {}
        // });
        try {
            //1 获取权限状态
            const res1 = await getSetting();
            const scopeAddress = res1.authSetting["scope.address"];
            // 2 判断权限状态
            if (scopeAddress === false) {
                // 4 诱导用户打开授权页面
                await openSetting();
            }
            //3 调用获取收货地址的api
            let address = await chooseAddress();
            address.all = address.provinceName + address.cityName + address.countyName + address.countyName + address.detailInfo
                // 5. 存入缓存中
            wx.setStorageSync("address", address);

            console.log(address);
        } catch (error) {
            console.log(error);
        }

    },
    // 商品的选中
    handelItemChange(e) {
        // 获取被修改的商品id
        const goods_id = e.currentTarget.dataset.id
            // 获取购物车数组
        let { cart } = this.data;
        // 找到被修改的商品对象
        let index = cart.findIndex(v => v.goods_id === goods_id)
            // 选中状态取反
        cart[index].checked = !cart[index].checked
            // 数据重新设置会data和缓存中
        this.setCart(cart)
    },
    // 设置购物车状态 重新计算 工具栏数据，全选总价，购买数量
    setCart(cart) {

        // 重新计算总价格和总数量
        let allChecked = true
            //  计算总价格
        let totalPrice = 0;
        let totalNum = 0;
        cart.forEach(v => {
            if (v.checked) {
                totalPrice += v.num * v.goods_price;
                totalNum += v.num
            } else {
                allChecked = false
            }
        });
        allChecked = cart.lenght != 0 ? allChecked : false;
        // 数据重新设置会data和缓存中
        this.setData({
            cart,
            totalPrice,
            totalNum,
            allChecked
        });
        wx.setStorageSync("cart", cart)
    },
    // 商品全选功能
    handleItemAllChange() {
        // 获取data种的数据
        let { cart, allChecked } = this.data;
        allChecked = !allChecked;
        cart.forEach(v => v.checked = allChecked);
        // 修改后的值填充会data，缓存中
        this.setCart(cart);
    },
    // 商品数量编辑
    async handleItemNumEdit(e) {
        // 获取传递过来的参数
        const { operation, id } = e.currentTarget.dataset;
        // 获取购物车数组
        let { cart } = this.data;
        // 找到需要修改的商品的索引
        const index = cart.findIndex(v => v.goods_id === id);
        if (cart[index].num === 1 && operation === -1) {
            const res = await showModal({ content: '你是否要删除？' })
            if (res.confirm) {
                cart.splice(index, 1);
                this.setCart(cart);
            }
        } else {
            // 修改数量
            cart[index].num += operation;
            // 保存数据
            this.setCart(cart)
        }
    },
    // 商品结算
    async handlePay() {
        //  判断收货地址
        const { address, totalNum } = this.data
        if (!address.userName) {
            await showToast({ title: '你还没有选择收货地址' })
            return;
        }
        // 2 判断用户有没有选购商品
        if (totalNum === 0) {
            await showToast({ title: '你还没有选购商品' })
            return;
        }
        // 跳转页面 支付页面
        wx.navigateTo({
            url: '/pages/pay/pay'
        });

    }
})